package gcp.gui;

import gcp.Colecionavel;
import gcp.Filme;
import gcp.Gibi;
import gcp.Jogo;
import gcp.gui.modelos.ColecionavelTableModel;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * FrameColecionaveis<br>
 * Frame responsavel pela exibicao dos itens colecionaveis do usuario.
 * @author Hildegard Naara Alves Furtado da Costa.
 */
public class FrameColecionaveis extends JInternalFrame {

    private static final long serialVersionUID = 1L;

    private FrameGCP frameGcp;

    private GCP gcp;

    private JButton botaoAdicionarFilme, botaoAdicionarGibi,
            botaoAdicionarJogo, botaoEditar, botaoRemover;

    private ColecionavelTableModel modelo;
    private JTable tabela;
    private JScrollPane barraDeRolagem;

    private Container tela;

    /**
     * Construtor
     * @param frameGcp
     */
    public FrameColecionaveis(FrameGCP frameGcp) {
        super("Coleções do usuário");
        this.frameGcp = frameGcp;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Inicializa os componentes.
     */
    private void inicializar() {
        setSize(600, 385);
        setClosable(true);

        tela = getContentPane();
        tela.setLayout(null);

        modelo = new ColecionavelTableModel();
        tabela = new JTable(modelo);
        barraDeRolagem = new JScrollPane(tabela);

        botaoAdicionarFilme = new JButton("Ad. Filme");
        botaoAdicionarGibi = new JButton("Ad. Gibi");
        botaoAdicionarJogo = new JButton("Ad. Jogo");
        botaoEditar = new JButton("Editar");
        botaoRemover = new JButton("Remover");
    }

    /**
     * Carrega os itens colecionaveis do usuario em tela.
     */
    private void carregar() {
        modelo.setItens(gcp.getList(frameGcp.getUsuarioLogado()));
    }

    /**
     * Define as posicoes dos componentes em tela.
     */
    private void posicoes() {
        barraDeRolagem.setBounds(7, 7, 577, 300);
        botaoAdicionarFilme.setBounds(7, 317, 80, 30);
        botaoAdicionarGibi.setBounds(97, 317, 80, 30);
        botaoAdicionarJogo.setBounds(187, 317, 80, 30);
        botaoEditar.setBounds(277, 317, 80, 30);
        botaoRemover.setBounds(367, 317, 80, 30);
    }

    /**
     * Define as acoes dos objetos.
     */
    private void acoes() {
        // Adiciona um Filme ao FrameColecionaveis.
        botaoAdicionarFilme.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                frameGcp.abrirJanela(new FrameFilme(frameGcp, null));
                dispose();
            }
        });
        // Adiciona um Gibi ao FrameColecionaveis.
        botaoAdicionarGibi.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                frameGcp.abrirJanela(new FrameGibi(frameGcp, null));
                dispose();
            }
        });
        // Adiciona um Jogo ao FrameColecionaveis.
        botaoAdicionarJogo.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                frameGcp.abrirJanela(new FrameJogo(frameGcp, null));
                dispose();
            }
        });
        // Remove um Colecionavel no FrameColecionaveis.
        botaoRemover.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                removerItem();
            }
        });
        // Edita um Colecionavel indicado no FrameColecionaveis.
        botaoEditar.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent arg0) {
                editar();
            }
        });

    }

    /**
     * Abre o frame para edição do item selecionado.
     */
    protected void editar() {
        // Retorna o numero da linha selecionada.
        int selecao = tabela.getSelectedRow();
        if (selecao < 0) {
            frameGcp.exibirMensagem("Não há nenhum item da coleção "
                    + "selecionado.");
            return;
        }
        Colecionavel itemASerEditado = modelo.get(selecao);
        if (itemASerEditado instanceof Filme) {
            frameGcp.abrirJanela(new FrameFilme(frameGcp,
                    (Filme) itemASerEditado));
        } else if (itemASerEditado instanceof Gibi) {
            frameGcp
                    .abrirJanela(new FrameGibi(frameGcp, (Gibi) itemASerEditado));
        } else if (itemASerEditado instanceof Jogo) {
            frameGcp
                    .abrirJanela(new FrameJogo(frameGcp, (Jogo) itemASerEditado));
        } else {
            frameGcp.exibirMensagem("Tipo desconhecido.");
        }
    }

    /**
     * Remove o item selecionado.
     */
    protected void removerItem() {
        // Retorna o numero da linha selecionada.
        int selecao = tabela.getSelectedRow();
        if (selecao < 0) {
            frameGcp.exibirMensagem("Não há nenhum item da coleção "
                    + "selecionado.");
            return;
        }
        Colecionavel itemASerRemovido = modelo.get(selecao);
        try {
            gcp.remover(frameGcp.getUsuarioLogado(), itemASerRemovido);
            carregar();
        } catch (Exception e) {
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona os componentes em tela.
     */
    private void constroiTela() {
        tela.add(barraDeRolagem);
        tela.add(botaoAdicionarFilme);
        tela.add(botaoAdicionarGibi);
        tela.add(botaoAdicionarJogo);
        tela.add(botaoEditar);
        tela.add(botaoRemover);
    }
}